/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Red_Neuronal2;

/**
 *
 * @author miguel mora
 */
public class Red_neuronal2 {

   
    /**
     * @param args the command line arguments
     */
    static double factorA= 0.5, resultado=0;
    double pesos[];
    double salidas[];
    double entradas[][];
    boolean cumple=false;
   
    public static void main(String[] args) {
        Red_neuronal2 neurona1 = new Red_neuronal2(2);
        neurona1.evaluar();
        neurona1.imprime_pesos();
    }
   
    void imprime_pesos() {
		
    	for (int i = 0; i < this.pesos.length; i++) {
    		System.out.println("Peso "+(i+1)+" = "+this.pesos[i]);
    	}
    	
		
	}

	Red_neuronal2(int entradas ){
   
    this.entradas = new double [(int) Math.pow(2,(entradas))][entradas+1];  
    this.pesos = new double [entradas+1];
    this.salidas = new double [(int) Math.pow(2,(entradas))];
    
    this.entradas[0][0]=-1;
    this.entradas[1][0]=1;
    this.entradas[2][0]=-1;
    this.entradas[3][0]=1;
   
    this.entradas[0][1]=-1;
    this.entradas[1][1]=-1;
    this.entradas[2][1]=1;
    this.entradas[3][1]=1;

    this.entradas[0][2]=1;
    this.entradas[1][2]=1;
    this.entradas[2][2]=1;
    this.entradas[3][2]=1;

    this.pesos[0]=0.3;
    this.pesos[1]=0.7;
    this.pesos[2]=-0.4;
    
    this.salidas[0]=-1;
    this.salidas[1]=1;
    this.salidas[2]=1;
    this.salidas[3]=1;
    
    
    }
    void evaluar(){
       
    	System.out.println("Filas : "+this.entradas.length);
    	System.out.println("Columnas : "+this.entradas[0].length);
    	
    	resultado=0;
    	
        for (int fila = 0; fila < this.entradas.length; fila++) {
            for (int columna = 0; columna < this.entradas[0].length; columna++) {
                resultado = resultado + (this.entradas[fila][columna] * this.pesos[columna]);
            }
            System.out.println("resultado = "+resultado+ " Salida esperada = "+this.salidas[fila]);
            
            if ((resultado<0 && salidas[fila]<0) || (resultado>0 && salidas[fila]>0))
                cumple=true;
            else{
                 cumple= false;
                 System.out.println("No cumplio en la fila : "+fila);
                 System.out.println("Se debe recalcular");
                 recalcular_pesos(fila);
                 
                }
        }
    }
   
    void recalcular_pesos(int fila) {
       
    	boolean evalua2=false;
    	System.out.println("Inicio de recalculo de pesos en la fila "+fila);
        System.out.println("Filas :"+this.entradas.length);
        System.out.println("Columnas :"+this.entradas[0].length);
       
        for (int columna = 0; columna < this.entradas[0].length; columna++) {
            this.pesos[columna] = this.pesos[columna] + (2 * factorA * this.entradas[fila][columna] * salidas[fila]);
            System.out.println(columna+" "+this.pesos[columna]);
        }
        evalua2 = evalua2(fila);
        if(evalua2==false)
        	recalcular_pesos(fila);
    }
    boolean evalua2(int fila){
    	
    	System.out.println("Inicio de evaluo  de pesos recalculados en la fila "+fila);
    	boolean evalua2=false;
    	resultado =0;
    	
        for (int columna = 0; columna < this.entradas[0].length; columna++) {
            resultado = resultado + (this.entradas[fila][columna] * this.pesos[columna]);
        }
        System.out.println("resultado = "+resultado+ " Salida esperada = "+this.salidas[fila]);
        
        if ((resultado<0 && salidas[fila]<0) || (resultado>0 && salidas[fila]>0)) 
        	evalua2=true;
        else{
             evalua2= false;
             System.out.println("No cumplio en la fila : "+fila);
             System.out.println("Se debe recalcular");
             }
    	return evalua2; 
    }
    
    
       /* pendiente desarrollo
    void llenar (){
   
       int saltos =1, aux=0;
    for (int columna = 0; columna < this.entradas.length; columna++) {
        while(aux==saltos)
            for (int fila = 0; fila < this.entradas[0].length; fila++) {
            this.entradas[columna][fila]=-1;
            aux++;
            }
        saltos= saltos+saltos;
        }
   
    }
    * */
   
}